package main

import (
	"fmt"
	"mygo/app/controller"
	"mygo/app/middleware"
	"mygo/app/models"
	"mygo/app/tools"
	"strconv"
	"time"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/xuri/excelize/v2"
	"gorm.io/gorm"
)

// var limiter = ratelimit.NewBucketWithQuantum(time.Second, 20, 20) //第一个20是每秒20个请求，第二个20是每秒最多20个请

// 登陆验证中间件
//	func AuthMiddleWare() gin.HandlerFunc {
//		return func(c *gin.Context) {
//			token := c.Query("name")
//			if token == "" {
//				c.JSON(http.StatusUnauthorized, gin.H{
//					"code": 401,
//					"msg":  "权限不足",
//				})
//				c.Abort()
//				return
//			}
//			c.Next()
//		}
//	}

var runMap = map[string]string{
	"local": "root:123456@tcp(localhost:3306)/wzdb?charset=utf8mb4&parseTime=True&loc=Local",
	// "local": "root:12345678@tcp(localhost:3306)/wzdb?charset=utf8mb4&parseTime=True&loc=Local",
	"nw": "root:123456@tcp(localhost:3305)/wzdb?charset=utf8mb4&parseTime=True&loc=Local",
	"ww": "root:123456@tcp(localhost:3305)/wzdb?charset=utf8mb4&parseTime=True&loc=Local",
}

func main() {
	//gin.SetMode(gin.ReleaseMode)
	// 初始化数据库
	//获取设备信息
	//r.Run(":9006")
	//	配置https,pem文件是证书，key是私钥
	//r.RunTLS(":9005", "./ssl.pem", "./ssl.key")
	//r.Run(":9005")

	// 测试环境
	// proType := "local"

	// 服务器生产环境
	//proType := "nw"
	proType := "ww"

	//dsn := "root:123456@tcp(localhost:3306)/wzdb?charset=utf8mb4&parseTime=True&loc=Local"
	err := models.InitDb(runMap[proType])
	if err != nil {
		fmt.Println("数据库连接失败")
		return
	}
	r := gin.Default()
	tools.GetTf()
	//定时任务，每6小时秒发送一次http请求，使用标准库的定时器
	ticker := time.NewTicker(time.Second * 3 * 60 * 60)
	go func() {
		for range ticker.C {
			tools.GetTf()
		}
	}()
	r.Use(cors.New(cors.Config{
		//对所有的请求都允许跨域
		AllowAllOrigins: true,
		//AllowOrigins:     []string{"http://124.70.20.171:2009", "http://39.103.180.154:1001", "http://39.103.180.154:1001", "http://124.70.20.171:888", "http://localhost:4000", "http://localhost:5000", "http://localhost:4050", "http://127.0.0.1:5500", "http://192.168.1.205:4050", "http://www.wzhy.com.cn:8000", "http://192.168.1.205:8000", "http://192.168.1.217:5000", "http://192.168.184.81:5000", "http://127.0.0.1:5500"},
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		AllowHeaders:     []string{"Content-Type", "Authorization"},
		AllowCredentials: true,
		MaxAge:           86400,
	}))
	//r.Use(cors.Default())
	// 使用 cors 中间件
	// 日志中间件
	r.Use(middleware.Base.Logger())
	//r.GET("/test", func(c *gin.Context) {
	//	var log []models.Log
	//	models.Db.Where("method = ?", "GET").Find(&log)
	//	c.JSON(200, gin.H{
	//		"code": 200,
	//		"msg":  "请求成功",
	//		"data": log,
	//	})
	//})
	r.POST("/test", func(c *gin.Context) {
		controller.Sm.GetTimeSeq(c)
	})
	r.POST("/jia", func(c *gin.Context) {
		var tf models.Tf
		result := models.Db.Order("id asc").First(&tf)
		if result.Error != nil {
			// 处理错误
		}

		models.Db.Model(&tf).Update("is_current", gorm.Expr("is_current + ?", 1))
		c.JSON(200, gin.H{
			"code": 200,
			"msg":  "请求成功",
		})

	})
	r.GET("/test1", func(c *gin.Context) {
		//这个还是挺颠覆认知的，不应该相信gpt随口说的专业内容。gin默认情况下接收请求就是异步的，异步的原理不知。
		//之前那种是在一个请求的代码中，这个不管干啥绝对的同步，接受请求相当于开一个线程去完成。
		num := c.Query("num")
		numInt, _ := strconv.Atoi(num)
		if numInt%2 == 0 {
			time.Sleep(time.Second * 1)
		}
		fmt.Println(num)
		c.JSON(200, gin.H{
			"code": 200,
			"msg":  "请求成功",
		})
	})

	r.POST("/login", func(c *gin.Context) {
		controller.Login.Login(c)
	})
	//createForeXlsx
	r.POST("/createForeXlsx", func(c *gin.Context) {
		controller.Forecast.CreateForeXlsx(c)
	})
	//register
	r.POST("/register", func(c *gin.Context) {
		controller.Login.Register(c)
	})
	r.POST("/upTest", func(c *gin.Context) {
		//controller.Login.Login(c)
		file, _ := c.FormFile("file")
		fmt.Println(file.Filename)
		//c.SaveUploadedFile(file, "./public/img/"+file.Filename)
		c.JSON(200, gin.H{
			"code": 200,
			"msg":  "请求成功",
			"data": file.Filename,
		})
	})

	r.Static("/img", "./public/img")
	r.Static("/imgSa", "./public/imgSa")
	r.Static("/word", "./public/word")
	r.Static("/ybd", "./public/ybd")
	r.Static("/jb", "./public/jb")

	user := r.Group("/user")
	{
		user.GET("/getUser", func(c *gin.Context) {
			controller.User.GetUser(c)
		})
	}
	fore := r.Group("/fore")
	{
		fore.POST("/upload", func(c *gin.Context) {
			controller.Forecast.UploadFile(c)
		})
		fore.GET("/getFore", func(c *gin.Context) {

		})
		fore.GET("/getFileList", func(c *gin.Context) {
			controller.Forecast.GetFileList(c)
		})
		//	savePng
		fore.POST("/savePng", func(c *gin.Context) {
			controller.Forecast.SavePng(c)
		})
		//	DeletePng
		fore.POST("/deletePng", func(c *gin.Context) {
			controller.Forecast.DeletePng(c)
		})
	}

	wz := r.Group("/wz")
	{
		wz.POST("/login", func(c *gin.Context) {
			controller.Wz.Login(c)
		})
		wz.GET("/getUser", func(c *gin.Context) {
			controller.Wz.GetUser(c)
		})
		wz.GET("/getForeList", func(c *gin.Context) {
			controller.Wz.GetForeList(c)
		})
		wz.POST("/subAlarm", func(c *gin.Context) {
			controller.Wz.SubAlarm(c)
		})
		wz.GET("/getAlarm", func(c *gin.Context) {
			controller.Wz.GetAlarm(c)
		})
		wz.GET("/getTideList", func(c *gin.Context) {
			controller.Wz.GetTideList(c)
		})
		wz.GET("/getLogList", func(c *gin.Context) {
			controller.Wz.GetLogList(c)
		})
		wz.GET("/getTwc", func(c *gin.Context) {
			controller.Wz.GetTwcList(c)
		})
		wz.POST("/updateUser", func(c *gin.Context) {
			controller.Wz.UpdateUser(c)
		})
		wz.POST("/subSetting", func(c *gin.Context) {
			controller.Wz.SubSetting(c)
		})
		wz.GET("/getLogCount", func(c *gin.Context) {
			controller.Wz.GetLogCount(c)
		})
		wz.GET("/getFbList", func(c *gin.Context) {
			controller.Wz.GetFbList(c)
		})
		wz.POST("/deleteAlarm", func(c *gin.Context) {
			controller.Wz.DeleteAlarm(c)
		})
		wz.POST("/sendFore", func(c *gin.Context) {
			controller.Wz.SendFore(c)
		})
		wz.GET("/getAlarmLast", func(c *gin.Context) {
			controller.Wz.GetAlarmLast(c)
		})
		wz.GET("/getAlarmLastByBh", func(c *gin.Context) {
			controller.Wz.GetAlarmLastByBh(c)
		})
		wz.GET("/getAlarmByConfig", func(c *gin.Context) {
			controller.Wz.GetAlarmByConfig(c)
		})
		wz.GET("/getTf", func(c *gin.Context) {
			controller.Wz.GetTf(c)
		})
		wz.GET("/getTideByHour", func(c *gin.Context) {
			controller.Wz.GetTideByHour(c)
		})
		//	GetLastWeek
		wz.GET("/getLastWeek", func(c *gin.Context) {
			controller.Wz.GetLastWeek(c)
		})
		wz.GET("/getAlarmByDay", func(c *gin.Context) {
			controller.Wz.GetAlarmByDay(c)
		})
		wz.GET("/getAlarmType", func(c *gin.Context) {
			controller.Wz.GetAlarmType(c)
		})
		//	UpdateAlarmType
		wz.POST("/updateAlarmType", func(c *gin.Context) {
			controller.Wz.UpdateAlarmType(c)
		})
		//不想分组了。
		wz.GET("/getForeDetail", func(c *gin.Context) {
			//controller.Wz.GetForeDetail(c)
			controller.Fore.GetForeDetailJson(c)
		})
		wz.GET("/getForeDetailLast", func(c *gin.Context) {
			//controller.Wz.GetForeDetailLast(c)
			controller.Fore.GetForeDetailLastJson(c)
		})
		wz.POST("/submitForeData", func(c *gin.Context) {
			//controller.Wz.SubmitForeData(c)
			controller.Fore.SubmitForeDataJson(c)
		})
		wz.POST("/updateFore", func(c *gin.Context) {
			//controller.Wz.UpdateFore(c)
			controller.Fore.UpdateForeJson(c)
		})
		wz.GET("/getForeTable", func(c *gin.Context) {
			//controller.Wz.GetForeTable(c)
			controller.Fore.GetForeTableJson(c)
		})

		//	UpdateAlarmDetail
		wz.POST("/updateAlarmDetail", func(c *gin.Context) {
			controller.Wz.UpdateAlarmDetail(c)
		})
		//	DelAlarmDetail
		wz.POST("/delAlarmDetail", func(c *gin.Context) {
			controller.Wz.DelAlarmDetail(c)
		})
		//	updateTwcTide
		wz.POST("/updateTwcTide", func(c *gin.Context) {
			controller.Wz.UpdateTwcTide(c)
		})
		//	GetConditionByDate
		wz.GET("/getConditionByDate", func(c *gin.Context) {
			controller.Wz.GetConditionByDate(c)
		})
		//	SendForeFile
		wz.POST("/sendForeFile", func(c *gin.Context) {
			controller.Wz.SendForeFile(c)
		})
		//	SendFax
		wz.POST("/sendFax", func(c *gin.Context) {
			controller.Wz.SendFax(c)
		})
		//	SendWxModel
		wz.POST("/sendWxModel", func(c *gin.Context) {
			controller.Wz.SendWxModel(c)
		})
		//	SendForeFileRaqx
		wz.POST("/sendForeFileRaqx", func(c *gin.Context) {
			controller.Wz.SendForeFileRaqx(c)
		})
	}

	sys := r.Group("/sys")
	{
		sys.GET("/getUserList", func(c *gin.Context) {
			controller.System.GetUserList(c)
		})
		sys.POST("/addUser", func(c *gin.Context) {
			controller.System.AddUser(c)
		})
		sys.POST("/updateUser", func(c *gin.Context) {
			controller.System.UpdateUser(c)
		})
		sys.POST("/delUser", func(c *gin.Context) {
			controller.System.DelUser(c)
		})
		sys.GET("/getRoleList", func(c *gin.Context) {
			controller.System.GetRoleList(c)
		})
		sys.POST("/addRole", func(c *gin.Context) {
			controller.System.AddRole(c)
		})
		sys.POST("/updateRole", func(c *gin.Context) {
			controller.System.UpdateRole(c)
		})
		sys.POST("/delRole", func(c *gin.Context) {
			controller.System.DelRole(c)
		})
		sys.GET("/getRightList", func(c *gin.Context) {
			controller.System.GetRightList(c)
		})
		sys.POST("/addRight", func(c *gin.Context) {
			controller.System.AddRight(c)
		})
		sys.POST("/delRight", func(c *gin.Context) {
			controller.System.DelRight(c)
		})
		sys.POST("/updateRight", func(c *gin.Context) {
			controller.System.UpdateRight(c)
		})
	}

	up := r.Group("/up")
	{
		up.POST("/uploadRbr", func(c *gin.Context) {
			controller.Up.UploadRbr(c)
		})
		up.POST("/uploadFb", func(c *gin.Context) {
			controller.Up.UploadFb(c)
		})
		up.POST("/savePng", func(c *gin.Context) {
			controller.Up.SavePng(c)
		})
	}
	send := r.Group("/send")
	{
		send.POST("/addEmail", func(c *gin.Context) {
			controller.Send.AddEmail(c)
		})
		send.GET("/getEmailList", func(c *gin.Context) {
			controller.Send.GetEmailList(c)
		})
		send.POST("/delEmail", func(c *gin.Context) {
			controller.Send.DelEmail(c)
		})
		send.POST("/updateEmail", func(c *gin.Context) {
			controller.Send.UpdateEmail(c)
		})
		send.GET("/getEmailById", func(c *gin.Context) {
			controller.Send.GetEmailById(c)
		})
		send.POST("/addFax", func(c *gin.Context) {
			controller.Send.AddFax(c)
		})
		send.GET("/getFaxList", func(c *gin.Context) {
			controller.Send.GetFaxList(c)
		})
		send.POST("/delFax", func(c *gin.Context) {
			controller.Send.DelFax(c)
		})
		send.POST("/updateFax", func(c *gin.Context) {
			controller.Send.UpdateFax(c)
		})
		send.GET("/getFaxById", func(c *gin.Context) {
			controller.Send.GetFaxById(c)
		})
		send.POST("/addFtp", func(c *gin.Context) {
			controller.Send.AddFtp(c)
		})
		send.GET("/getFtpList", func(c *gin.Context) {
			controller.Send.GetFtpList(c)
		})
		send.POST("/delFtp", func(c *gin.Context) {
			controller.Send.DelFtp(c)
		})
		send.POST("/updateFtp", func(c *gin.Context) {
			controller.Send.UpdateFtp(c)
		})
		send.GET("/getFtpById", func(c *gin.Context) {
			controller.Send.GetFtpById(c)
		})
		send.POST("/updateFore", func(c *gin.Context) {
			controller.Send.UpdateFore(c)
		})
		send.GET("/getSendLogList", func(c *gin.Context) {
			controller.Send.GetSendLogList(c)
		})
		send.GET("/getMailConfig", func(c *gin.Context) {
			controller.Send.GetMailConfig(c)
		})
		send.POST("/updateMailConfig", func(c *gin.Context) {
			controller.Send.UpdateMailConfig(c)
		})
		send.GET("/getAlarm", func(c *gin.Context) {
			controller.Send.GetAlarmList(c)
		})
		send.POST("/updateAlarm", func(c *gin.Context) {
			controller.Send.UpdateAlarm(c)
		})
		send.GET("/getAlarmConfigByType", func(c *gin.Context) {
			controller.Send.GetAlarmConfigByType(c)
		})
		//	GetMessageList
		send.GET("/getMessageList", func(c *gin.Context) {
			controller.Send.GetMessageList(c)
		})
		//	SendMessage
		send.POST("/sendMessage", func(c *gin.Context) {
			controller.Send.SendMessage(c)
		})
	}
	sm := r.Group("/sm")
	{
		sm.GET("/getPngListByDay", func(c *gin.Context) {
			controller.Sm.GetPngListByDay(c)
		})
	}
	sq := r.Group("/sq")
	{
		sq.GET("getExcel", func(c *gin.Context) {
			f, _ := excelize.OpenFile("a.xlsx")
			//defer func() {
			//	if err := f.Close(); err != nil {
			//		fmt.Println(err)
			//	}
			//}()
			cell, _ := f.GetCellValue("Sheet1", "A1")
			fmt.Println(cell)
			err = f.SetCellValue("Sheet1", "B2", 100)
			if err != nil {
				fmt.Println(err)
				return
			}
			_ = f.SaveAs("Book1.xlsx")
			//	返回文件
			c.File("./Book1.xlsx")
		})
	}
	tide := r.Group("/tide")
	{
		//	SaveTideData
		tide.POST("/saveTideData", func(c *gin.Context) {
			controller.Tide.SaveTideData(c)
		})
		//	GetTwcListNew
		tide.GET("/getTwcListNew", func(c *gin.Context) {
			controller.Tide.GetTwcListNew(c)
		})
		//	GetTwcListNewW
		tide.GET("/getTwcListNewW", func(c *gin.Context) {
			controller.Tide.GetTwcListNewW(c)
		})
	}
	//mt := r.Group("/mt")
	//{
	//	mt.GET("/getFisheryData", func(c *gin.Context) {
	//		controller.Mituo.GetFisheryData(c)
	//	})
	//	mt.GET("/getSeaAreaFcst", func(c *gin.Context) {
	//		controller.Mituo.GetSeaAreaFcst(c)
	//	})
	//	mt.GET("/getRouteFcstData", func(c *gin.Context) {
	//		controller.Mituo.GetRouteFcstData(c)
	//	})
	//	mt.GET("/getTouismFcstData", func(c *gin.Context) {
	//		controller.Mituo.GetTouismFcstData(c)
	//	})
	//	mt.POST("/getTideDataByRegion", func(c *gin.Context) {
	//		controller.Mituo.GetTideDataByRegion(c)
	//	})
	//	mt.POST("/getTideDataByStation", func(c *gin.Context) {
	//		controller.Mituo.GetTideDataByStation(c)
	//	})
	//	mt.POST("/getWarnList", func(c *gin.Context) {
	//		controller.Mituo.GetWarnList(c)
	//	})
	//	mt.POST("/getWarnDetailed", func(c *gin.Context) {
	//		controller.Mituo.GetWarnDetailed(c)
	//	})
	//}
	r.POST("/Fishery/index/getFisheryData", func(c *gin.Context) {
		controller.Mituo.GetFisheryData(c)
	})
	r.POST("/seaarea/index/getSeaAreaFcst", func(c *gin.Context) {
		controller.Mituo.GetSeaAreaFcst(c)
	})
	r.POST("/Route/index/getRouteFcstData", func(c *gin.Context) {
		controller.Mituo.GetRouteFcstData(c)
	})
	r.POST("/tourism/index/getTouismFcstData", func(c *gin.Context) {
		controller.Mituo.GetTouismFcstData(c)
	})
	r.POST("/tide/index/getTideFcstData", func(c *gin.Context) {
		controller.Mituo.GetTideDataByRegion(c)
	})
	r.POST("/route/index/getTideFcstData", func(c *gin.Context) {
		controller.Mituo.GetTideDataByStation(c)
	})

	r.POST("/Warn/index/getWarnList", func(c *gin.Context) {
		controller.Mituo.GetWarnList(c)
	})
	r.POST("/Warn/index/getWarnDetailed", func(c *gin.Context) {
		controller.Mituo.GetWarnDetailed(c)
	})
	r.POST("/Warn/index/getLastWarn", func(c *gin.Context) {
		controller.Mituo.GetLastWarn(c)
	})
	r.POST("/Warn/index/getIndexLastWarn", func(c *gin.Context) {
		controller.Mituo.GetIndexLastWarn(c)
	})
	r.POST("/Warn/index/getTideWarnData", func(c *gin.Context) {
		controller.Mituo.GetTideWarnData(c)
	})

	wx := r.Group("/wx")
	{
		//GetForeDetailByCode
		wx.GET("/getForeDetailByCode", func(c *gin.Context) {
			controller.Wx.GetForeDetailByCode(c)
		})
		//	GetSignature
		wx.GET("/getSignature", func(c *gin.Context) {
			controller.Wx.GetSignature(c)
		})
	}

	czx := r.Group("/czx")
	{
		czx.GET("/getRcData", func(c *gin.Context) {
			controller.Czx.GetRcData(c)
		})
		czx.GET("/getXianData", func(c *gin.Context) {
			controller.Czx.GetXianData(c)
		})
		//	GetGangkouData
		czx.GET("/getGangkouData", func(c *gin.Context) {
			controller.Czx.GetGangkouData(c)
		})
	}

	tools.Ceshi()
	//r.Run(":9006")
	//	配置https,pem文件是证书，key是私钥
	//r.RunTLS(":9005", "./ssl.pem", "./ssl.key")
	//r.Run(":9005")

	if proType == "local" {
		r.Run(":9005")
	} else if proType == "nw" {
		r.Run(":9006")
	} else if proType == "ww" {
		r.RunTLS(":9005", "./ssl.pem", "./ssl.key")
	}

}
